#!/usr/bin/env python

import pypvm
import sys
from ini import *
from time import sleep

def minegamax(tab, jugador, prof_actual, prof_limite, jugada_actual):
    """int [7][7] tablero : el tablero actual de juego para realizar el analisis
    int jugador: el jugador que realiza el movimiento
    int limite: el limite de la profundidad del arbol a para realizar la busqueda"""
    bandera = 0
    mejor_jugada = None
    if(prof_limite <= prof_actual or terminal_test(tab)):
        return(utility(tab), jugada_actual)
    else:
        sucesor=realizar_jugada(tab, jugador)
        for i in sucesor:
            resultado=-1.0e350#infinito
            #hace una copia del tablero
            bandera = 1
            nuevotablero = [[], [], [], [], [], [], [], []]            
            clonar_tablero(tab, nuevotablero)
            make_move(nuevotablero, jugador,{i:sucesor.get(i)})
            #se hace la llamada recursiva
            regreso = minegamax(nuevotablero,(jugador*-1), (prof_actual+1), prof_limite, {i:sucesor.get(i)}.keys().pop())
            mayor = max(resultado,-regreso[0])
            if (mayor == -regreso[0]):
                mejor_jugada = regreso[1]
            resultado = mayor

        if (bandera == 1):
            return (resultado, mejor_jugada)
        else:
            resultado=-1.0e350#infinito
            return (resultado, mejor_jugada)
    return (resultado, mejor_jugada)
    

def minimax(data):
    return minegamax(data['tablero'], data['jugador'], data['prof_actual'], data['prof_limite'], None)

try:
    #signal (SIGTERM, sig_h)
    parent = pypvm.parent()

# ============================ test recv() ===================================

    while (True):
        print "SLAVE: receiving data from tid %s..." % parent
        pypvm.recv(parent, 1)
        # ============================ test up() =============================
        print "SLAVE: unpacking data..."
        data = pypvm.upk()
        print "SLAVE: data received = %s" % data
        
        #print 'SLAVE: sleep 2 seconds'
        #sleep(2)

        # calculemos
        result = minimax(data)
        # sending results to master...
        pypvm.initsend(pypvm.data['default'])
        print "SLAVE: sending data to master..."
        print 'SLAVE: data: '
        print result
        pypvm.pk(result)
        pypvm.send(parent, 2)

    print "SLAVE: exiting pvm..."
    pypvm.exit()

except:
    print "A pypvm error occured!"
    a =  sys.exc_info()
    print str(a[0])
    print a[1]
